<?php

namespace Mssae\SeoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Mssae\SeoBundle\Entity\ProjetAnnuaire;
use Mssae\SeoBundle\Entity\Projet ;
use Mssae\SeoBundle\Form\ProjetAnnuaireType;
use JMS\SecurityExtraBundle\Annotation\Secure ;

/**
 * ProjetAnnuaire controller.
 *
 */
class ProjetAnnuaireController extends Controller
{
    /**
     * Lists all ProjetAnnuaire entities.
     *
     */
    public function indexAction($idProject)
    {
        $entities = $this->_getRepository('ProjetAnnuaire')
                             ->findByProject($idProject);
        
        $nombreProjetAnnuaire = count($entities);
        
        return $this->render('MssaeSeoBundle:ProjetAnnuaire:index.html.twig', array(
            'entities'  => $entities,
            'nombreProjetAnnuire'  => $nombreProjetAnnuaire,
            'idProject' => $idProject
        ));
    }

    /**
     * Finds and displays a ProjetAnnuaire entity.
     *
     */
    public function showAction($id, $idProject)
    {
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('MssaeSeoBundle:ProjetAnnuaire')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find ProjetAnnuaire entity.');
        }

        $deleteForm = $this->createDeleteForm($id);

        return $this->render('MssaeSeoBundle:ProjetAnnuaire:show.html.twig', array(
            'entity'      => $entity,
            'idProject' => $idProject,            
            'delete_form' => $deleteForm->createView(),

        ));
    }

    /**
     * Displays a form to create a new ProjetAnnuaire entity.
     *
     */
    public function newAction($idProject)
    {
        //récupère la liste des annuaires déjà uitliser pour le projet
        $listInvalidAnnuaire = $this->_getProjectUsedAnnuaireList($idProject) ;
        
        //récupère la liste ordonnée des annuaires (invalid et valid)
        $listOrdonneesAnnuaires = $this->_getProjectlistOrderAnnuaire($idProject) ;
        
        //on rend à la vue tous les variables dont on a besion ainsi que le formulaire
        $entity = new ProjetAnnuaire();
        $form   = $this->createForm(new ProjetAnnuaireType(), $entity);        
        return $this->render('MssaeSeoBundle:ProjetAnnuaire:new.html.twig',
                            array
                                (
                                    'entity' => $entity,                                
                                    'listInvalidAnnuaire' => $listInvalidAnnuaire,
                                    'listOrdonneesAnnuaires' => $listOrdonneesAnnuaires,
                                    'idProject' => $idProject,
                                    'form'   => $form->createView()                                
                                ));
        
    }

    /**
     * Creates a new ProjetAnnuaire entity.
     *
     */
    public function createAction($idProject)
    {
        $entity  = new ProjetAnnuaire();
        
        //l'user doit être celui de la session actuelle
        $entity->setUser($this->get('security.context')->getToken()->getUser()); 
        
        //on alimente le champ projet
        $projet = $this->_getRepository('Projet')->find($idProject) ;
        $entity->setProjet($projet) ;
            
        $request = $this->getRequest();
        
        //on alimente l'attribut annuaire de l'entité
        $idAnnuaire = $request->get('idAnnuaire') ;
        
        $annuaire  = $this->_getRepository('Annuaire')->find($idAnnuaire) ;
        $entity->setAnnuaire($annuaire) ;
        
        $form    = $this->createForm(new ProjetAnnuaireType(), $entity);
        $form->bindRequest($request);
        
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->persist($entity);
            $em->flush();
            
            return $this->redirect($this->generateUrl('projetannuaire_new', 
                                    array('idProject' =>$idProject)));
            /*return $this->redirect($this->generateUrl('projetannuaire_show', 
                                    array('id' => $entity->getId(),
                                          'idProject' => $idProject
                                         )));*/
            
            
        }
        
        $listInvalidAnnuaire = $this->_getProjectUsedAnnuaireList($idProject) ;
        $listOrdonneesAnnuaires = $this->_getProjectlistOrderAnnuaire($idProject) ;
        
        return $this->render('MssaeSeoBundle:ProjetAnnuaire:new.html.twig',
                            array
                                (
                                    'entity' => $entity,                                
                                    'listInvalidAnnuaire' => $listInvalidAnnuaire,
                                    'listOrdonneesAnnuaires' => $listOrdonneesAnnuaires,
                                    'idProject' => $idProject,
                                    'form'   => $form->createView()                                
                                ));
        
    }

    /**
     * Displays a form to edit an existing ProjetAnnuaire entity.
     *
     */
    public function editAction($id, $idProject)
    {
        //récupère la liste des annuaires déjà uitliser pour le projet
        $listInvalidAnnuaire = $this->_getProjectUsedAnnuaireList($idProject) ;
        
        //récupère la liste ordonnée des annuaires (invalid et valid)
        $listOrdonneesAnnuaires = $this->_getProjectlistOrderAnnuaire($idProject) ;
        
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('MssaeSeoBundle:ProjetAnnuaire')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find ProjetAnnuaire entity.');
        }
        
        $editForm = $this->createForm(new ProjetAnnuaireType(), $entity);
        $deleteForm = $this->createDeleteForm($id);
        
        /*
         * portion pour la pagination de la liste d'annuaire
         * nombre page
         * nombre annuaire par page
         * 
         */
        $annuaireParPage = 5;
        $nombreAnnuaire = count($listOrdonneesAnnuaires);
        $nombrePage = ceil($nombreAnnuaire / $annuaireParPage);
        
        return $this->render('MssaeSeoBundle:ProjetAnnuaire:edit.html.twig', array(
            'entity'      => $entity,
            'listInvalidAnnuaire' => $listInvalidAnnuaire,
            'listOrdonneesAnnuaires' => $listOrdonneesAnnuaires,
            'nombrePage' => $nombrePage,
            'annuaireParPage' => $annuaireParPage,
            'idProject' => $idProject,         
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * Edits an existing ProjetAnnuaire entity.
     *
     */
    public function updateAction($id, $idProject)
    {
        //récupère la liste des annuaires déjà uitliser pour le projet
        $listInvalidAnnuaire = $this->_getProjectUsedAnnuaireList($idProject) ;
        
        //récupère la liste ordonnée des annuaires (invalid et valid)
        $listOrdonneesAnnuaires = $this->_getProjectlistOrderAnnuaire($idProject) ;
        
        $em = $this->getDoctrine()->getEntityManager();

        $entity = $em->getRepository('MssaeSeoBundle:ProjetAnnuaire')->find($id);

        if (!$entity) {
            throw $this->createNotFoundException('Unable to find ProjetAnnuaire entity.');
        }

        $editForm   = $this->createForm(new ProjetAnnuaireType(), $entity);
        $deleteForm = $this->createDeleteForm($id);

        $request = $this->getRequest();
        
        //on alimente l'attribut annuaire de l'entité
        $idAnnuaire = $request->get('idAnnuaire') ;
        
        $annuaire  = $this->_getRepository('Annuaire')->find($idAnnuaire) ;
        $entity->setAnnuaire($annuaire) ;        
        $editForm->bindRequest($request);

        if ($editForm->isValid()) {
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('projetannuaire_edit',
                                    array(
                                            'id' => $id,
                                            'idProject' => $idProject,                                         
                                         )));
        }

        return $this->render('MssaeSeoBundle:ProjetAnnuaire:edit.html.twig', array(
            'entity'      => $entity,
            'idProject' => $idProject,  
            'listInvalidAnnuaire' => $listInvalidAnnuaire,
            'listOrdonneesAnnuaires' => $listOrdonneesAnnuaires,
            'edit_form'   => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

    /**
     * Deletes a ProjetAnnuaire entity.
     *
     */
    public function deleteAction($id,$idProject)
    {
        $form = $this->createDeleteForm($id);
        $request = $this->getRequest();

        $form->bindRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $entity = $em->getRepository('MssaeSeoBundle:ProjetAnnuaire')->find($id);

            if (!$entity) {
                throw $this->createNotFoundException('Unable to find ProjetAnnuaire entity.');
            }

            $em->remove($entity);
            $em->flush();
        }

        return $this->redirect($this->generateUrl('projetannuaire', array('idProject' => $idProject)));
    }
    
    private function createDeleteForm($id)
    {
        return $this->createFormBuilder(array('id' => $id))
            ->add('id', 'hidden')
            ->getForm()
        ;
    }
    
    private function _getRepository($zNomEntity)
    {
        return $toProjets = $this->getDoctrine()
                                 ->getEntityManager()
                                 ->getRepository("MssaeSeoBundle:$zNomEntity");  
    }   
    
    /**
     * fonction qui récupère la liste de tous les annuaires avec lesquelles
     * le projet a déjà été inscrit
     */
    private function _getProjectUsedAnnuaireList($idProject)
    {
        //on récupère d'abord tous les projetAnnuaires pour le projet
        $listProjetAnnuaires = $this->_getRepository('ProjetAnnuaire')
                                    ->findByProject($idProject) ; 
        //et on insère dans un tableau la listes des annuaires les concernant
        $listInvalidAnnuaire = array();
        foreach ($listProjetAnnuaires as  $projetAnnuaire)
        {
            $listInvalidAnnuaire[] = $projetAnnuaire->getAnnuaire() ;
        }        
        
        return $listInvalidAnnuaire;
    }
    /**
     * retourne la liste des de tous les annuaires dans l'ordre
     * les utilisés pour le projet en premier et le reste après 
     */
    private function _getProjectlistOrderAnnuaire($idProject)
    {
        //récupérer toutes les Annuaires
        $listAnnuaires = $this->_getRepository('Annuaire')->findAll();
        
        //on récupère la liste de tous les annuaires déjà utilisé pour le projet
        $listInvalidAnnuaire = $this->_getProjectUsedAnnuaireList($idProject) ;
        
        /*
         * tableau de la liste des annuaires ordonnées
         * préremplie par celles des invalides en premier
         */
        $listOrdonneesAnnuaires = $listInvalidAnnuaire ;
               
        /*
         * on enleve de la liste de les annuaires celles qui ont déjà servies
         * et après on les mets à la fin de la liste ordonnée
         */
        $listAnnuairesTemp = $listAnnuaires ;        
        foreach ($listInvalidAnnuaire as $invalidAnnuaire)
        {
            unset($listAnnuairesTemp[array_search($invalidAnnuaire,$listAnnuairesTemp)]) ;
        }
        $listOrdonneesAnnuaires = array_merge($listOrdonneesAnnuaires, $listAnnuairesTemp) ;  
        
        return $listOrdonneesAnnuaires;
    }    
}
